#ifndef TEXTURA_H_
#define TEXTURA_H_

#include <string>
#include <stdexcept>

class Texels;

class Textura {
   private:
      unsigned int id;

   protected:
      Textura() {}
      void cargar(const Texels &texels);

   public:
      class SinMemoriaExcepcion : public std::runtime_error {
         public:
            SinMemoriaExcepcion(const std::string &quePaso) throw();
            virtual ~SinMemoriaExcepcion() throw();
      };

      Textura(const Texels &texels);

      void enlazar();
      void desenlazar();

      void setMagnificador(int mag);
      void setMinificador(int min);

      void setWrapS(int w);
      void setWrapT(int w);

      /*
       * Determina como sera usados los colores de la textura.
       * Siendo Cs y As las componentes RGB y Alfa de la textura,
       * siendo Cf y Af las componentes RGB y Alfa del fragmento,
       * siendo C y A las componentes RGB y Alfa finales resultantes,
       * entonces:
       *
       * Si uso == GL_REPLACE:
       *    C = Cs
       *    A = As
       *
       *    Simplemente aplica la textura ignorando el contenido del 
       *    fragmento Cf y Af lo que permite por ejemplo renderizar imagenes
       *    sin que sean afectadas por los colores bases o la iluminacion.
       *
       * Si uso == GL_MODULATE:
       *    C = Cs Cf
       *    A = As Af
       *
       *    Tipicamente usado con Cf = (k, k, k) con k > 0. Esto permite
       *    modular los colores de la textura Cs en funcion del parametro k
       *    Donde k puede depender del color base mas la iluminacion dandole
       *    a la textura un efecto 3d debido a la iluminacion.
       *
       * Si uso == GL_DECAL:
       *    C = Cf (1 - As) + Cs As
       *    A = Af
       *
       *    Es una version modificada de GL_REPLACE. Donde se usa As como
       *    factor para determinar el grado de reemplazo. Con valores As 
       *    cercanos a 1, C = Cs mientras que con As cercanos a 0 C = Cf.
       *
       *
       * Si uso == GL_ADD:
       *    C = Cf + Cs
       *    A = Af As
       *
       **/
      void setUso(int uso);

      virtual ~Textura();

};
#endif
